package ar.com.android.alco.utils;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import android.content.Context;
import android.util.Log;
import ar.com.android.alco.dbHelpers.SQLALCOHelper;
import ar.com.android.alco.entities.Alimentos;
import ar.com.android.alco.entities.CategoriaAlimentos;
import ar.com.android.alco.entities.ControlPeso;
import ar.com.android.alco.entities.DatosUsuario;
import ar.com.android.alco.entities.Version;
import ar.com.android.alco.forms.R;
import ar.com.android.alco.http.CustomHttpClient;
import ar.com.android.alco.providers.AlimentosProvider;
import ar.com.android.alco.providers.CategoriaAlimentosProvider;
import ar.com.android.alco.providers.ControlPesoProvider;
import ar.com.android.alco.providers.DatosUsuarioProvider;
import ar.com.android.alco.providers.VersionProvider;

public class SyncDatabase {
	
	private static final String TAG = "SyncDatabase";
	
	public static Integer getVersionALCO(Context context) throws Exception
	{
		try
		{
			ArrayList<NameValuePair> postParameters;
			String response;
			
			//Get Version ALCO
			postParameters = new ArrayList<NameValuePair>();
			postParameters.add(new BasicNameValuePair(Constants.ACTION, Constants.ACTION_GETVERSIONALIMENTOS));
		
			response = CustomHttpClient.executeHttpPost(context.getString(R.string.urlServerUtils) , postParameters);
			JSONObject joVersion = new JSONObject(response);
			
			return Integer.parseInt(joVersion.getString("version"));
			
		}
		catch(Exception e) {
			throw e;
		}
	}
	
	public static void syncDatabaseControlPeso(Context context) throws Exception
	{
		Integer idUsuario = AppGlobalVariables.getInstance().getIdUsuarioALCO();
		if(idUsuario == null)
			return;

		SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(context);
		sqlHelper.dbOpen();

		try 
		{
			ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
			String response;

			ControlPesoProvider controlPesoProvider = new ControlPesoProvider(context);
			List<ControlPeso> lstControlPesoo = controlPesoProvider.getControlesPeso();
			
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			
			JSONArray jaControlPeso = new JSONArray();
			for(ControlPeso controlPeso : lstControlPesoo) {
				JSONObject joControlPeso = new JSONObject();
				
				joControlPeso.accumulate("fechaControl", sdf.format(controlPeso.getFechaControl()));
				joControlPeso.accumulate("peso", controlPeso.getPeso().toString());
				joControlPeso.accumulate("creditosDisp", controlPeso.getCreditosDisp().toString());
				
				jaControlPeso.put(joControlPeso);
			}
						
			postParameters.add(new BasicNameValuePair(Constants.ACTION, Constants.ACTION_SET_CONTROLPESO));
			postParameters.add(new BasicNameValuePair("idUsuarioALCO", idUsuario.toString()));
			postParameters.add(new BasicNameValuePair("jaControlPeso", jaControlPeso.toString()));
			
			response = CustomHttpClient.executeHttpPost(context.getString(R.string.urlServerUtils) , postParameters);
			
			JSONObject jsonResponse = new JSONObject(response);
			
			if(jsonResponse.getString("status").equals("ERROR")) {
				Log.e(TAG, "Error al sincronizar los Controles de Peso.");
			}
		} catch (Exception e) {
			Log.e(TAG, "Error al sincronizar los Controles de Peso." + e);
		}
		finally {
			sqlHelper.dbClose();
		}
	}
	
	public static void syncDatabaseUsuario(Context context, DatosUsuario datosUsuario) throws Exception
	{
		ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
		String response;

		SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(context);
		sqlHelper.dbOpen();
				
		sqlHelper.beginTransaction();
		
		try 
		{
			DatosUsuarioProvider datosUsuarioProvider = new DatosUsuarioProvider(context);
						
			postParameters.add(new BasicNameValuePair(Constants.ACTION, Constants.ACTION_SET_DATOSUSUARIO));
			postParameters.add(new BasicNameValuePair("nombreApellido", datosUsuario.getNombreApellido()));
			postParameters.add(new BasicNameValuePair("email", datosUsuario.getEmail()));
			postParameters.add(new BasicNameValuePair("pesoInicio", datosUsuario.getPesoInicio().toString()));
			postParameters.add(new BasicNameValuePair("pesoPosible", datosUsuario.getPesoPosible().toString()));
			postParameters.add(new BasicNameValuePair("altura", datosUsuario.getAltura().toString()));
			postParameters.add(new BasicNameValuePair("sexo", datosUsuario.getSexo()));
			postParameters.add(new BasicNameValuePair("fase", datosUsuario.getFase()));
			
			response = CustomHttpClient.executeHttpPost(context.getString(R.string.urlServerUtils) , postParameters);
			
			JSONObject jsonResponse = new JSONObject(response);
			
			if(jsonResponse.getString("status").equals("OK")) {
				datosUsuario.setIdUsuarioALCO(jsonResponse.getInt("idUsuario"));
				datosUsuarioProvider.updateDatosUsuario(datosUsuario);
				sqlHelper.commitTransaction();
			}
			else {
				Log.e(TAG, "Error al sincronizar los Datos del Usuario. ID: " + datosUsuario.getIdDatosUsuario());
			}
			
		} catch (Exception e) {
			sqlHelper.rollbackTransaction();
			Log.e(TAG, "Error al sincronizar los Datos del Usuario.\n" + e);
			throw new Exception("Error al sincronizar los Datos del Usuario.\n" + e);
		}
		finally {
			sqlHelper.dbClose();
		}
	}
	
	public static void syncDatabaseAlimentos(Context context, Integer versionNumber) throws Exception
	{
		ArrayList<NameValuePair> postParameters;
		String response;

		SQLALCOHelper sqlHelper = SQLALCOHelper.getHelper(context);
		sqlHelper.dbOpen();
				
		sqlHelper.beginTransaction();
		
		try 
		{
			VersionProvider versionProvider = new VersionProvider(context);
			
			if(versionProvider.getTableEmpty()) {
				Version version = new Version();
				version.setIdVersion(1);
				version.setVersion(versionNumber);
				versionProvider.insertVersion(version);
			}
			else {
				Version version = versionProvider.getLastVersion();
				version.setVersion(versionNumber);
				versionProvider.updateVersion(version);
			}
			//Alimentos Sync			
			postParameters = new ArrayList<NameValuePair>();
			postParameters.add(new BasicNameValuePair(Constants.ACTION, Constants.ACTION_GETALIMENTOS));
		
			response = CustomHttpClient.executeHttpPost(context.getString(R.string.urlServerUtils) , postParameters);
			JSONArray jaAlimentos = new JSONArray(response);
			
			AlimentosProvider alimentosDataSource = new AlimentosProvider(context);
			alimentosDataSource.removeAlimentos();
			for(int iLoop = 0; iLoop < jaAlimentos.length(); iLoop++)
			{
				JSONObject joAlimento = jaAlimentos.getJSONObject(iLoop);
				
				Alimentos alimento = new Alimentos();
				alimento.setIdAlimento(joAlimento.getInt("idAlimento"));
				alimento.setIdCategoriaAlimento(joAlimento.getInt("idCategoriaAlimento"));
				alimento.setDescripcion(joAlimento.getString("descripcion"));
				alimento.setCalorias(joAlimento.getDouble("calorias"));
				alimento.setEquivalencia(joAlimento.getString("equivalencia"));
				alimento.setCreditos(joAlimento.getDouble("creditos"));
				
				alimentosDataSource.insertAlimento(alimento);
			}
			
			//Categoria Alimentos Sync
			postParameters = new ArrayList<NameValuePair>();
			postParameters.add(new BasicNameValuePair(Constants.ACTION, Constants.ACTION_GETCATEGORIA_ALIMENTOS));
		
			response = CustomHttpClient.executeHttpPost(context.getString(R.string.urlServerUtils) , postParameters);
			JSONArray jaCategoriaAlimentos = new JSONArray(response);
			
			CategoriaAlimentosProvider categoriaAlimentosProvider = new CategoriaAlimentosProvider(context);
			categoriaAlimentosProvider.removeCategoriaAlimentos();
			for(int iLoop = 0; iLoop < jaCategoriaAlimentos.length(); iLoop++)
			{
				JSONObject joCategoriaAlimento = jaCategoriaAlimentos.getJSONObject(iLoop);
				
				CategoriaAlimentos categoriaAlimentos = new CategoriaAlimentos();
				categoriaAlimentos.setIdCategoria(joCategoriaAlimento.getInt("idCategoria"));
				categoriaAlimentos.setDescripcion(joCategoriaAlimento.getString("descripcion"));
				
				categoriaAlimentosProvider.insertCategoriaAlimento(categoriaAlimentos);
			}
			
			sqlHelper.commitTransaction();

		} catch (Exception e) {
			sqlHelper.rollbackTransaction();
			Log.e(TAG, "Error al sincronizar la base de datos.\n" + e);
			throw new Exception("Error al sincronizar la base de datos.\n" + e);
		}
		finally {
			sqlHelper.dbClose();
		}
	}
}
